<?php
/**
 * 文件上传
 */

// 允许上传的文件后缀
//$allow_exts = ['jpg', 'jpeg', 'png', 'gif', 'mp4', 'mp3', 'apk'];

// 表单数据
$form_data = $_POST;

// 文件数据
$file_data = $_FILES['data'];

// 文件错误
if($file_data['error'] > 0){
	ajaxReturnError('错误：'.$file_data['error']);
}

// 上传目录
$upload_path = './upload_file/';

// 文件是否分片上传
if(array_key_exists('chunked', $form_data) && $form_data['chunked']){
	// 创建临时文件目录
	$tmp_file_path = $upload_path."_".$form_data['fileName'];
	if(!is_dir($tmp_file_path)){
		if(!mkdir($tmp_file_path, 0777, true)){
			ajaxReturnError("临时文件目录创建失败！");
		}
	}
	
	// 移动文件
	$tmp_file_name = $tmp_file_path."/".$form_data['currentChunk']."_".$form_data['uuid'].".blob";
	if(!move_uploaded_file($file_data['tmp_name'], $tmp_file_name)){
		ajaxReturnError('移动文件出错！');
	}
	
	// 计算文件分块是是否等于总分块数
	$blob_file_list = scandir($tmp_file_path);		// 分块文件列表
	$dir_file_count = count($blob_file_list)-2;		// 块文件数量
	
	// 文件块数量未达到总量
	if($dir_file_count != $form_data['totalChunk']){
		ajaxReturnSuccess('文件分块上传成功！上传继续中...');
	}
	
	// 全部上传完成,读取每个文件块并按顺序合并
	$file_content = '';
	for($i=0; $i<$dir_file_count; $i++){
		// 读取文件
		$blob_file_name = $tmp_file_path."/".$i."_".$form_data['uuid'].".blob";
		$file_content .= file_get_contents($blob_file_name);
	}
	
	// 合并写入文件
	$file_name = $upload_path.$form_data['fileName'];
	if(!file_put_contents($file_name, $file_content)){
		ajaxReturnError('文件合并错误！');
	}
	
	// 删除临时文件及目录
	foreach($blob_file_list as $_t_f){
		if($_t_f == '.' || $_t_f == '..'){continue;}
		unlink($tmp_file_path."/".$_t_f);
	}
	rmdir($tmp_file_path);
}else{
	// 移动文件
	if(!move_uploaded_file($file_data['tmp_name'], $upload_path.$form_data['uuid'])){
		ajaxReturnError('移动文件出错！');
	}
}

// 文件上传成功
ajaxReturnSuccess('文件上传成功！');

/**
 * ajax 返回成功
 */
function ajaxReturnSuccess($result=''){
	echo json_encode(['status'=>1, 'result'=>$result]);die;
}

/**
 * ajax 返回错误
 */
function ajaxReturnError($result=''){
	echo json_encode(['status'=>0, 'result'=>$result]);die;
}
?>